Temporal overview

p_year %>% 
  inner_join(poems,by=c("p_id")) %>%
  count(collection,year) %>%
  mutate(measure="yearly count") %>%
  union_all(
    p_year %>% # 10 year rolling mean
    distinct(year) %>% 
    left_join(p_year %>% distinct(year),sql_on="RHS.year BETWEEN LHS.year-5 AND LHS.year+5") %>%
    inner_join(p_year,by=c("year.y"="year")) %>%
    inner_join(poems,by=c("p_id")) %>%
    group_by(collection=collection,year=year.x) %>%
    summarize(n=n()/10,.groups="drop") %>%
    mutate(measure="10 year rolling mean")
  ) %>%
  filter(year>0,year<9999,collection!="literary") %>%
  ggplot(aes(x=year,y=n,color=measure)) +
  geom_point(data=~.x %>% filter(measure=="yearly count")) +
  geom_line(data=~.x %>% filter(measure=="10 year rolling mean")) +
  theme_hsci_discrete(base_family="Arial") + 
  theme(legend.justification=c(0,1), legend.position=c(0.02, 0.98), legend.background = element_blank(), legend.key=element_blank()) + 
  labs(color=NULL) +
  scale_y_continuous(breaks=seq(0,20000,by=2000),labels=scales::comma_format()) +
  ylab("Poems") +
  scale_x_continuous(breaks=seq(1000,2000,by=50)) +
  xlab("Year") +
  facet_wrap(~collection, ncol=1) +
  ggtitle("Number of poems by year and collection")

p_year %>% 
  filter(year %in% c(0,9999)) %>% 
  left_join(poems) %>% 
  count(collection,year) %>%
  ungroup() %>%
  gt() %>%
  tab_header(title=\Abnormal years\) %>%
  fmt_integer(n)

Overview of collectors

poems %>% 
  distinct(collection) %>%
  pull() %>%
  map(~p_col %>% 
    inner_join(poems %>% filter(collection==.x),by=c("p_id")) %>%
    count(col_id) %>%
    left_join(collectors,by=c("col_id")) %>%
    select(col_id,name,n) %>%
    collect() %>%
    mutate(col_id=fct_reorder(str_c(col_id,"|",name),n)) %>%
    mutate(col_id=fct_lump_n(col_id,n=100,w=n)) %>%
    mutate(col_id=fct_relevel(col_id,"Other")) %>%
    group_by(col_id) %>%
    tally(wt=n) %>% {
      ggplot(.,aes(x=col_id,y=n)) +
      geom_col() +
      geom_text(aes(label=p(n)),hjust='left',nudge_y = 100) +
      theme_hsci_discrete(base_family="Arial") +
      coord_flip() +
      labs(title=str_c("Collectors in ",.x))
    }
  )
Warning: 1 unknown level in `f`: Other
[[1]]

[[2]]

[[3]]

[[4]]

p_col %>% 
  anti_join(collectors) %>%
  count(col_id) %>%
  gt() %>%
  tab_header(title=\Collectors without a name\) %>%
  fmt_integer(n)

Geographical overview

d <- p_loc %>% 
  count(loc_id) %>% 
  inner_join(locations) %>%
  select(name,n) %>%
  collect()

poems_without_location <- poems %>% 
  anti_join(p_loc) %>% 
  count() %>% 
  pull()

unprojected_locations <- d %>%
  anti_join(polygons) %>%
  add_row(name=NA,n=poems_without_location)
polygons %>%
  left_join(d) %>%
  tm_shape() +
  tm_polygons(col='n', id='name', style='fisher', palette='plasma') +
  tm_layout(title=str_c(\Geographical overview. Missing \,unprojected_locations %>% tally(wt=n) %>% pull() %>% p,\ poems.\))

tm_tiles
#FFFFFF00
blank
Esri.WorldGrayCanvas

OpenStreetMap

Esri.WorldTopoMap
base
n
name
tm_fill
#666666
solid
#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#7E03A8

#7E03A8

#BFBFBF

#0D0887

#7E03A8

#7E03A8

#F89441

#F89441

#CC4678

#CC4678

#0D0887

#0D0887

#0D0887

#BFBFBF

#7E03A8

#0D0887

#BFBFBF

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#F89441

#0D0887

#7E03A8

#7E03A8

#0D0887

#0D0887

#BFBFBF

#BFBFBF

#CC4678

#7E03A8

#0D0887

#0D0887

#7E03A8

#0D0887

#F89441

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#CC4678

#0D0887

#0D0887

#0D0887

#CC4678

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#BFBFBF

#7E03A8

#F89441

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#7E03A8

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#7E03A8

#CC4678

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#BFBFBF

#7E03A8

#0D0887

#0D0887

#7E03A8

#7E03A8

#0D0887

#7E03A8

#0D0887

#7E03A8

#BFBFBF

#7E03A8

#0D0887

#0D0887

#7E03A8

#7E03A8

#7E03A8

#CC4678

#7E03A8

#CC4678

#7E03A8

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#7E03A8

#BFBFBF

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#CC4678

#7E03A8

#0D0887

#7E03A8

#0D0887

#F89441

#7E03A8

#F89441

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#7E03A8

#BFBFBF

#CC4678

#CC4678

#7E03A8

#0D0887

#BFBFBF

#CC4678

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#CC4678

#BFBFBF

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#7E03A8

#CC4678

#0D0887

#BFBFBF

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#F89441

#BFBFBF

#7E03A8

#7E03A8

#7E03A8

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#7E03A8

#0D0887

#7E03A8

#7E03A8

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#CC4678

#BFBFBF

#0D0887

#0D0887

#F0F921

#7E03A8

#0D0887

#0D0887

#0D0887

#7E03A8

#BFBFBF

#BFBFBF

#0D0887

#7E03A8

#0D0887

#BFBFBF

#CC4678

#CC4678

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#BFBFBF

#0D0887

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#7E03A8

#F0F921

#0D0887

#0D0887

#CC4678

#BFBFBF

#0D0887

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#7E03A8

#BFBFBF

#0D0887

#7E03A8

#0D0887

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#BFBFBF

#BFBFBF

#7E03A8

#0D0887

#BFBFBF

#0D0887

#7E03A8

#0D0887

#7E03A8

#0D0887

#BFBFBF

#7E03A8

#0D0887

#7E03A8

#7E03A8

#BFBFBF

#0D0887

#0D0887

#CC4678

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#F89441

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#CC4678

#BFBFBF

#7E03A8

#7E03A8

#BFBFBF

#0D0887

#CC4678

#0D0887

#0D0887

#BFBFBF

#BFBFBF

#CC4678

#0D0887

#7E03A8

#BFBFBF

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#BFBFBF

#BFBFBF

#BFBFBF

#7E03A8

#0D0887

#0D0887

#0D0887

#CC4678

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#7E03A8

#CC4678

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#CC4678

#0D0887

#0D0887

#0D0887

#CC4678

#7E03A8

#7E03A8

#0D0887

#BFBFBF

#CC4678

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#7E03A8

#BFBFBF

#7E03A8

#BFBFBF

#7E03A8

#0D0887

#7E03A8

#0D0887

#0D0887

#CC4678

#0D0887

#7E03A8

#0D0887

#CC4678

#BFBFBF

#CC4678

#CC4678

#BFBFBF

#BFBFBF

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#7E03A8

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#BFBFBF

#7E03A8

#F89441

#0D0887

#0D0887

#BFBFBF

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#0D0887

#7E03A8

#0D0887

#7E03A8

#0D0887

#7E03A8

#BFBFBF

#0D0887

#7E03A8

#0D0887

#7E03A8

#7E03A8

#7E03A8

#7E03A8

#CC4678

#CC4678

#0D0887

#7E03A8

#0D0887

#0D0887

#BFBFBF

#F89441

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#7E03A8

#BFBFBF

#0D0887

#0D0887

#7E03A8

#7E03A8

#0D0887

#0D0887

#7E03A8

#0D0887

#CC4678

#CC4678

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#BFBFBF

#CC4678

#F89441

#7E03A8

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#F89441

#7E03A8

#0D0887

#CC4678

#0D0887

#CC4678

#CC4678

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#BFBFBF

#0D0887

#0D0887

#7E03A8

#0D0887

#7E03A8

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#CC4678

#7E03A8

#0D0887

#0D0887

#BFBFBF

#0D0887

#BFBFBF

#CC4678

#0D0887

#BFBFBF

#BFBFBF

#0D0887

#BFBFBF

#7E03A8

#BFBFBF

#0D0887

#0D0887

#F89441

#7E03A8

#0D0887

#7E03A8

#7E03A8

#BFBFBF

#7E03A8

#0D0887

#BFBFBF

#BFBFBF

#0D0887

#F0F921

#BFBFBF

#F0F921

#7E03A8

#0D0887

#0D0887

#CC4678

#CC4678

#CC4678

#0D0887

#7E03A8

#0D0887

#7E03A8

#0D0887

#CC4678

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#BFBFBF

#0D0887

#7E03A8

#7E03A8

#0D0887

#0D0887

#CC4678

#7E03A8

#CC4678

#CC4678

#0D0887

#7E03A8

#7E03A8

#CC4678

#F89441

#BFBFBF

#BFBFBF

#0D0887

#CC4678

#CC4678

#0D0887

#7E03A8

#0D0887

#0D0887

#7E03A8

#0D0887

#BFBFBF

#0D0887

#7E03A8

#0D0887

#7E03A8

#CC4678

#0D0887

#0D0887

#CC4678

#CC4678

#0D0887

#0D0887

#0D0887

#CC4678

#0D0887

#F89441

#BFBFBF

#0D0887

#0D0887

#7E03A8

#0D0887

#BFBFBF

#0D0887

#BFBFBF

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#CC4678

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#CC4678

#7E03A8

#7E03A8

#0D0887

#BFBFBF

#0D0887

#7E03A8

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#7E03A8

#0D0887

#7E03A8

#BFBFBF

#0D0887

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#CC4678

#0D0887

#7E03A8

#0D0887

#0D0887

#7E03A8

#F89441

#7E03A8

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#BFBFBF

#CC4678

#BFBFBF

#0D0887

#0D0887

#0D0887

#F89441

#F0F921

#CC4678

#BFBFBF

#0D0887

#7E03A8

#BFBFBF

#0D0887

#0D0887

#0D0887

#F0F921

#0D0887

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#7E03A8

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#0D0887

#BFBFBF

#0D0887

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#F89441

#0D0887

#0D0887

#CC4678

#BFBFBF

#BFBFBF

#BFBFBF

#7E03A8

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#7E03A8

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#CC4678

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#F89441

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#7E03A8

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#7E03A8

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#BFBFBF

#0D0887

#0D0887

#7E03A8

#0D0887

#BFBFBF

#0D0887

#CC4678

#7E03A8

#7E03A8

#F0F921

#F89441

#7E03A8

#0D0887

#BFBFBF

#F89441
1 to 312

312 to 847

847 to 1,732

1,732 to 3,075

3,075 to 3,985

Missing
#0D0887

#7E03A8

#CC4678

#F89441

#F0F921

#BFBFBF
#666666
n
n
name
to
Less

than
or

more
metric
png
Geographical overview. Missing 37,345 poems.
#FFFFFF
YlOrBr
RdYlGn
Set3
black
#000000
plain
#000000
#FFFFFF
right
vertical
left

bottom
#000000
plain
#000000
plain
to
Less

than
or

more
left

top
#000000
plain
#000000
plain
#CCCCCC
#000000
plain
left
bottom
right

bottom
left

bottom
Esri.WorldGrayCanvas

OpenStreetMap

Esri.WorldTopoMap
topright
left

top
grey85

grey40

grey60

black

black

black

grey75

grey95
Missing
dummy

.
km
none
km
km

Poem locations not mapped

unprojected_locations %>%
  arrange(desc(n)) %>%
  gt() %>%
  tab_header(\Poem locations not mapped\) %>%
  fmt_integer(n)

Geographical overview by collection

d <- p_loc %>% 
  left_join(poems) %>%
  count(collection,loc_id) %>% 
  ungroup() %>%
  inner_join(locations) %>%
  select(collection,name,n) %>%
  collect()

poems_without_location <- poems %>% 
  anti_join(p_loc) %>% 
  count(collection) %>% 
  collect() %>%
  mutate(name=NA_character_)

unprojected_locations <- d %>%
  anti_join(polygons) %>%
  union_all(poems_without_location)
poems %>% 
  distinct(collection) %>%
  pull() %>%
  map(~
    tm_shape(
      polygons %>%
        left_join(
          p_loc %>% 
            inner_join(poems %>% filter(collection==.x),by=c(\p_id\)) %>%
            count(loc_id) %>% 
            inner_join(locations) %>%
            select(name,n) %>%
            collect()
        )
    ) +
    tm_polygons(col='n', id='name', style='fisher', palette='plasma') +
    tm_layout(title=str_c(\Geography of \,.x,\. Missing \,unprojected_locations %>% filter(collection==.x) %>% tally(wt=n) %>% pull() %>% p,\ poems.\))
  )
[[1]]


[[2]]


[[3]]


[[4]]

Poem locations not mapped by collection

poems %>% 
  distinct(collection) %>%
  pull() %>%
  map(~
    unprojected_locations %>%
      filter(collection==.x) %>%
      arrange(desc(n)) %>%
      select(-collection) %>%
      gt() %>%
      tab_header(str_c("Poem locations not mapped in ",.x)) %>%
      fmt_integer(n)
  )

[[1]]

Poem locations not mapped in skvr
name n
Narvusi 3,202
Vuole 1,524
Uusikirkko Vpl 1,131
Pyhäjärvi Vpl 785
Etelä-Karjala 658
Pohjois-Pohjanmaa 557
Länsipohja 396
Kiimaisjärvi 363
Etelä-Savo 350
Tveri 294
Viipuri mlk 277
Salo 198
Pieksämäki 183
Pyhäjärvi Ol 160
Koski Hl 134
Pohjois-Karjala 129
Uusikirkko Tl 116
Tulomajärvi 115
Tornio 113
Porvoo mlk 112
Pyhäjärvi Ul 102
Pohjois-Savo 98
Viena 98
Satakunta 83
Säräisniemi 74
Uusikaupunki 71
Heinola mlk 62
Häme 61
Ruija 60
Jyväskylä mlk 52
Keski-Inkeri 49
Hämeenlinna 48
Kovero 47
Tuutari=Tuuteri 45
Laatokan Karjala (Raja-Karjala) 44
Itä- ja Pohjois-Inkeri 42
Kainuu 38
Kuopio mlk 35
Peräpohjola 33
Varkaus 30
Kajaani mlk 30
Etelä-Pohjanmaa 27
Keminmaa 26
Varsinais-Suomi 24
Mänttä 22
Novgorodin alue 22
Kotka 20
Mikkeli mlk 17
Karjala Tl 16
Alajärvi 16
Kimito 15
Prunkkala 14
Savonlinna 14
Sortavala mlk 13
Revonlahti-Revolax 12
Alakiiminki 11
Taipale (Enontaipale) 9
Helsingin pit 7
Sulva-Solf-Solv 7
Siuntio 6
Mustasaari-Korsholm 6
Siipyy-Sideby 6
Uzmana 6
Suma 6
Lapväärtti-Lappfjärd 5
Vaasa 5
Lappeenranta 4
Kenjärvi 4
Vammala 3
Kirkkonummi 3
Kokkola-Gamlakarleby 3
Kuolajärvi 3
Uusimaa 2
Iisalmi mlk 2
Pietarsaari-Jakobstad 2
Jepua-Jeppo 2
Kouta 2
Länsi-Inkeri 2
Uusikaupunki mlk 1
Anjalankoski 1
Keski-Suomi 1
Lieksa 1
Raippaluoto-Replot 1
Kuhmoniemi 1

[[2]]

Poem locations not mapped in erab
name n
NA 2,008
välismaa 1,822
Tartu 973
Tallinn 685
Viljandi l. 602
Pärnu l. 598
Viljandimaa 480
Võrumaa 452
Narva l. 422
Läänemaa 329
Rakvere l. 304
Saaremaa 205
Valga 150
Pärnumaa 102
Paide l. 88
Haapsalu 86
Võru l. 60
Valgamaa 58
Sõrve 40
Järvamaa 39
Virumaa 36
Tartumaa 29
Hiiumaa 23
Harjumaa 17
Kuressaare l. 3

[[3]]

Poem locations not mapped in jr
name n
Narvusi 1,780
NA 1,591
Peräpohjola 809
Uusikirkko Vpl 803
Viena 773
Itä- ja Pohjois-Inkeri 757
Hämeenlinna 517
Keski-Inkeri 483
Viron Inkeri 433
Länsi-Inkeri 424
Sortavala mlk 406
Uusikaupunki 386
Tulomajärvi 353
Keminmaa 349
Pohjois-Pohjanmaa 252
Savonlinna 240
Pyhäjärvi Vpl 215
Lahti 189
Pyhäjärvi Ol 164
Pieksämäki 163
Säräisniemi 159
Vuole 155
Etelä-Pohjanmaa 154
Mikkeli mlk 144
Pyhäjärvi Ul 143
Viipuri mlk 123
Kuusankoski 115
Etelä-Karjala 112
Pohjois-Karjala 111
Pohjois-Savo 110
Tveri 110
Salo 107
Riihimäki 104
Helsingin pit 96
Mänttä 91
Kiimaisjärvi 85
Lapväärtti-Lappfjärd 82
Kainuu 81
Kotka 76
Alajärvi 75
Toijala 70
Laatokan Karjala (Raja-Karjala) 63
Etelä-Savo 62
Uusikirkko Tl 61
Lappeenranta 59
Tornio 59
Heinola mlk 55
Tuutari=Tuuteri 55
Pohjois-Pirkkala 47
Uusimaa 44
Kuopio mlk 42
Karjala Tl 35
Varkaus 32
Ruija 31
Kajaani mlk 30
Porvoo mlk 22
Storfjord 20
Parainen 18
Lappi Tl 17
Jyväskylä mlk 17
Vaasa 17
Vaala 17
Karkkila 16
Kouvola 16
Rovaniemi mlk 16
Kerava 15
Valkeakoski 15
Lieksa 15
Kuusisto 13
Muoslompolo 13
Uusikaupunki mlk 12
Hongonjoki 12
Satakunta 12
Novgorodin alue 12
Kemiö 11
Salo 11
Pieksämäki mlk 11
Iisalmi mlk 11
Pielisensuu 11
Särkisalo 10
Hamina 10
Kokkola-Gamlakarleby 10
Kristiinankaupunki-Kristinestad 10
Revonlahti-Revolax 10
Nauvo 9
Junosuando 9
Karesuando 9
Jämsänkoski 8
Koski Hl 8
Äänislinna 8
Kuhmoniemi 7
Muurmanni 7
Häme 6
Suolahti 6
Taipale 6
Mustasaari-Korsholm 6
Länsipohja 6
Rauma mlk 5
Kuolajärvi 5
Kistrand 5
Moseija 5
Kenjärvi 5
Imatra 4
Uusikaarlepyy-Nykarleby 4
Siipyy-Sideby 4
Yliveteli 4
Lauritsala 3
Ruukki 3
Koutokeino 3
Riipuskala 3
Varsinais-Suomi 2
Vammala 2
Järvenpää 2
Tiudia 2
Jaama 2
Prunkkala 1
Ikaalinen mlk 1
Myllykoski 1
Kirkkonummi 1
Loviisa 1
Sipoo 1
Nurmes mlk 1
Petolahti-Petalax 1
Oulu mlk 1
Nordkapp 1
Maasöy 1
Muodoslompolo 1
Pietari=Leningrad 1
Siestarjoki 1
Ahvenanmaa 1

[[4]]

Poem locations not mapped in literary
name n
NA 727

NA

Spatiotemporal overview

d <- poems %>%
  left_join(p_year %>% mutate(year=if_else(year %in% c(0L,9999L),NA,year))) %>% 
  collect() %>%
  mutate(year_ntile=ntile(year,11)) %>%
  group_by(year_ntile) %>%
  mutate(years=str_c(min(year),\-\,max(year))) %>%
  ungroup() %>%
  left_join(p_loc %>% collect()) %>% 
  count(years,loc_id) %>% 
  ungroup() %>%
  left_join(locations %>% select(loc_id,name) %>% collect())
polygons %>% 
  left_join(d %>% complete(name,years)) %>%
  tm_shape() +
  tm_polygons(col='n', id='name', style='fisher', palette='plasma') +
  tm_layout(main.title="Geographical overviews by time",legend.outside.size=0.1) +
  tm_facets(by="years",ncol=4)
Joining, by = "name"

Poem verse statistics

Line types

d <- verses %>% 
  left_join(verse_poem) %>% 
  left_join(poems) %>% 
  count(collection,type) %>% 
  arrange(collection,desc(n)) %>%
  collect()
Joining, by = "v_id"Joining, by = "p_id"
d %>% 
  group_by(collection) %>%
  mutate(proportion=n/sum(n)) %>%
  gt() %>%
  fmt_integer(n) %>%
  fmt_percent(proportion)
type n proportion
skvr
V 1,340,987 94.63%
L 44,303 3.13%
CPT 27,869 1.97%
K 3,931 0.28%
erab
V 1,861,583 93.39%
PAG 53,040 2.66%
CPT 19,844 1.00%
L 18,465 0.93%
TYH 18,357 0.92%
REF 17,869 0.90%
LRY 3,868 0.19%
RRE 307 0.02%
MRK 52 0.00%
U 38 0.00%
LLI 2 0.00%
TYP 1 0.00%
jr
V 812,343 90.94%
L 49,411 5.53%
CPT 28,030 3.14%
K 3,502 0.39%
literary
V 82,460 97.54%
L 1,220 1.44%
CPT 777 0.92%
K 87 0.10%

Verse line lengths

d_nr_characters <- verses_cl %>%
  mutate(nr_characters=str_length(text)) %>%
  left_join(verse_poem) %>% 
  left_join(poems) %>% 
  count(collection,nr_characters) %>% 
  ungroup() %>%
  arrange(collection,desc(n)) %>%
  collect()
Joining, by = "v_id"Joining, by = "p_id"

Verse line lengths in characters

d_nr_characters %>% 
  filter(nr_characters<=60) %>%
  ggplot(aes(x=nr_characters,y=n)) +
  geom_col(width=1) +
  facet_wrap(~collection,scales="free_y") +
  theme_hsci_discrete(base_family="Arial") +
  scale_y_continuous(labels=scales::comma_format()) +
  labs(title="Number of characters in verse lines")

d_nr_characters %>% 
  group_by(collection) %>%
  mutate(prop=n/sum(n)) %>%
  ungroup() %>%
  filter(nr_characters<=60) %>%
  ggplot(aes(x=nr_characters,y=collection,fill=collection,height=prop)) +
  geom_density_ridges(stat='identity') +
  theme_hsci_discrete(base_family="Arial") +
#  scale_y_continuous(labels=scales::percent_format()) +
  labs(title="Number of characters in verse lines")

Verse lines with more than 60 characters

d_nr_characters %>% 
  mutate(nl=if_else(nr_characters>60,n,0L)) %>%
  group_by(collection) %>%
  summarise(lines=sum(nl),proportion=sum(nl)/sum(n),.groups="drop") %>%
  arrange(desc(lines)) %>%
  gt() %>%
  tab_header(title="Verse lines with more than 60 characters") %>%
  fmt_integer(lines) %>%
  fmt_percent(proportion)
Verse lines with more than 60 characters
collection lines proportion
jr 1,911 0.24%
erab 291 0.02%
skvr 202 0.02%
literary 1 0.00%

Verse line lengths in words

d_nr_words %>% 
  filter(nr_words<=10) %>%
  ggplot(aes(x=nr_words,y=n)) +
  geom_col(width=1) +
  facet_wrap(~collection,scales="free_y") +
  scale_x_continuous(breaks=seq(0,10,by=2)) +
  scale_y_continuous(labels=scales::comma_format()) +
  theme_hsci_discrete(base_family="Arial") +
  labs(title="Number of words in verse lines")

d_nr_words %>% 
  filter(nr_words<=10) %>%
  uncount(n) %>%
  ggplot(aes(x=nr_words,y=collection,fill=collection)) +
  stat_binline(binwidth=1) +
  theme_hsci_discrete(base_family="Arial") +
  scale_x_continuous(breaks=seq(0,10,by=2)) +
#  scale_y_continuous(labels=scales::percent_format()) +
  labs(title="Number of words in verse lines")

Verse lines with more than 10 words

d_nr_words %>% 
  mutate(nl=if_else(nr_words>10,n,0L)) %>%
  group_by(collection) %>%
  summarise(lines=sum(nl),proportion=sum(nl)/sum(n),.groups="drop") %>%
  arrange(desc(lines)) %>%
  gt() %>%
  tab_header(title="Verse lines with more than 10 words") %>%
  fmt_integer(lines) %>%
  fmt_percent(proportion)
Verse lines with more than 10 words
collection lines proportion
jr 839 0.11%
erab 257 0.01%
skvr 38 0.00%
literary 9 0.01%
d <- word_occ %>%
  inner_join(words %>%
    mutate(nr_characters=str_length(text))) %>%
  group_by(v_id) %>%
  summarise(nr_characters,nr_words=max(pos)) %>%
  left_join(verse_poem) %>% 
  left_join(poems) %>% 
  count(collection,nr_words,pos,nr_characters) %>%
  collect()
Joining, by = "w_id"Joining, by = "v_id"Joining, by = "p_id"Error:  [0]
d %>%
  group_by(collection,nr_words,pos) %>%
  mutate(prop=n/sum(n)) %>%
  ungroup() %>%
  filter(nr_words>=2,nr_words<6) %>%
  mutate(nr_words=as_factor(nr_words),pos=as_factor(pos)) %>%
  uncount(n) %>%
  ggplot(aes(x=nr_characters,y=nr_words,fill=nr_words)) +
  stat_binline(binwidth=1) +
  facet_grid(collection~pos,labeller = labeller(pos=label_both)) + 
  xlab("Number of characters in word") +
  ylab("Number of words in verse") +
  labs(
    title="Number of characters in words by their position",
    subtitle="According to length of verse and collection"
    ) +
  theme_hsci_discrete(base_family="Arial")

LS0tCnRpdGxlOiAiR2VuZXJhbCBzdGF0aXN0aWNhbCBvdmVydmlld3Mgb2YgRklMVEVSIGRhdGEiCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCiAgICB0b2M6IHllcwogIGh0bWxfZG9jdW1lbnQ6CiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIHRvYzogeWVzCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChtZXNzYWdlPUZBTFNFLGRwaT03MixmaWcucmV0aW5hPTIsZmlnLndpZHRoPTgpCnNvdXJjZShoZXJlOjpoZXJlKCJjb2RlL2NvbW1vbl9iYXNpcy5SIiksIGxvY2FsID0ga25pdHI6OmtuaXRfZ2xvYmFsKCkpCmBgYAoKIyBUZW1wb3JhbCBvdmVydmlldwoKYGBge3IgdGVtcG9yYWxfb3ZlcnZpZXcsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTh9CnBfeWVhciAlPiUgCiAgaW5uZXJfam9pbihwb2VtcyxieT1jKCJwX2lkIikpICU+JQogIGNvdW50KGNvbGxlY3Rpb24seWVhcikgJT4lCiAgbXV0YXRlKG1lYXN1cmU9InllYXJseSBjb3VudCIpICU+JQogIHVuaW9uX2FsbCgKICAgIHBfeWVhciAlPiUgIyAxMCB5ZWFyIHJvbGxpbmcgbWVhbgogICAgZGlzdGluY3QoeWVhcikgJT4lIAogICAgbGVmdF9qb2luKHBfeWVhciAlPiUgZGlzdGluY3QoeWVhciksc3FsX29uPSJSSFMueWVhciBCRVRXRUVOIExIUy55ZWFyLTUgQU5EIExIUy55ZWFyKzUiKSAlPiUKICAgIGlubmVyX2pvaW4ocF95ZWFyLGJ5PWMoInllYXIueSI9InllYXIiKSkgJT4lCiAgICBpbm5lcl9qb2luKHBvZW1zLGJ5PWMoInBfaWQiKSkgJT4lCiAgICBncm91cF9ieShjb2xsZWN0aW9uPWNvbGxlY3Rpb24seWVhcj15ZWFyLngpICU+JQogICAgc3VtbWFyaXplKG49bigpLzEwLC5ncm91cHM9ImRyb3AiKSAlPiUKICAgIG11dGF0ZShtZWFzdXJlPSIxMCB5ZWFyIHJvbGxpbmcgbWVhbiIpCiAgKSAlPiUKICBmaWx0ZXIoeWVhcj4wLHllYXI8OTk5OSxjb2xsZWN0aW9uIT0ibGl0ZXJhcnkiKSAlPiUKICBnZ3Bsb3QoYWVzKHg9eWVhcix5PW4sY29sb3I9bWVhc3VyZSkpICsKICBnZW9tX3BvaW50KGRhdGE9fi54ICU+JSBmaWx0ZXIobWVhc3VyZT09InllYXJseSBjb3VudCIpKSArCiAgZ2VvbV9saW5lKGRhdGE9fi54ICU+JSBmaWx0ZXIobWVhc3VyZT09IjEwIHllYXIgcm9sbGluZyBtZWFuIikpICsKICB0aGVtZV9oc2NpX2Rpc2NyZXRlKGJhc2VfZmFtaWx5PSJBcmlhbCIpICsgCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLCBsZWdlbmQucG9zaXRpb249YygwLjAyLCAwLjk4KSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpKSArIAogIGxhYnMoY29sb3I9TlVMTCkgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDAsMjAwMDAsYnk9MjAwMCksbGFiZWxzPXNjYWxlczo6Y29tbWFfZm9ybWF0KCkpICsKICB5bGFiKCJQb2VtcyIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgxMDAwLDIwMDAsYnk9NTApKSArCiAgeGxhYigiWWVhciIpICsKICBmYWNldF93cmFwKH5jb2xsZWN0aW9uLCBuY29sPTEpICsKICBnZ3RpdGxlKCJOdW1iZXIgb2YgcG9lbXMgYnkgeWVhciBhbmQgY29sbGVjdGlvbiIpCmBgYAoKYGBge3J9CnBfeWVhciAlPiUgCiAgZmlsdGVyKHllYXIgJWluJSBjKDAsOTk5OSkpICU+JSAKICBsZWZ0X2pvaW4ocG9lbXMpICU+JSAKICBjb3VudChjb2xsZWN0aW9uLHllYXIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGU9IkFibm9ybWFsIHllYXJzIikgJT4lCiAgZm10X2ludGVnZXIobikKYGBgCgojIE92ZXJ2aWV3IG9mIGNvbGxlY3RvcnMKCmBgYHtyIGNvbGxlY3RvcnNfb3ZlcnZpZXcsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTExfQpwb2VtcyAlPiUgCiAgZGlzdGluY3QoY29sbGVjdGlvbikgJT4lCiAgcHVsbCgpICU+JQogIG1hcCh+cF9jb2wgJT4lIAogICAgaW5uZXJfam9pbihwb2VtcyAlPiUgZmlsdGVyKGNvbGxlY3Rpb249PS54KSxieT1jKCJwX2lkIikpICU+JQogICAgY291bnQoY29sX2lkKSAlPiUKICAgIGxlZnRfam9pbihjb2xsZWN0b3JzLGJ5PWMoImNvbF9pZCIpKSAlPiUKICAgIHNlbGVjdChjb2xfaWQsbmFtZSxuKSAlPiUKICAgIGNvbGxlY3QoKSAlPiUKICAgIG11dGF0ZShjb2xfaWQ9ZmN0X3Jlb3JkZXIoc3RyX2MoY29sX2lkLCJ8IixuYW1lKSxuKSkgJT4lCiAgICBtdXRhdGUoY29sX2lkPWZjdF9sdW1wX24oY29sX2lkLG49MTAwLHc9bikpICU+JQogICAgbXV0YXRlKGNvbF9pZD1mY3RfcmVsZXZlbChjb2xfaWQsIk90aGVyIikpICU+JQogICAgZ3JvdXBfYnkoY29sX2lkKSAlPiUKICAgIHRhbGx5KHd0PW4pICU+JSB7CiAgICAgIGdncGxvdCguLGFlcyh4PWNvbF9pZCx5PW4pKSArCiAgICAgIGdlb21fY29sKCkgKwogICAgICBnZW9tX3RleHQoYWVzKGxhYmVsPXAobikpLGhqdXN0PSdsZWZ0JyxudWRnZV95ID0gMTAwKSArCiAgICAgIHRoZW1lX2hzY2lfZGlzY3JldGUoYmFzZV9mYW1pbHk9IkFyaWFsIikgKwogICAgICBjb29yZF9mbGlwKCkgKwogICAgICBsYWJzKHRpdGxlPXN0cl9jKCJDb2xsZWN0b3JzIGluICIsLngpKQogICAgfQogICkKYGBgCgpgYGB7cn0KcF9jb2wgJT4lIAogIGFudGlfam9pbihjb2xsZWN0b3JzKSAlPiUKICBjb3VudChjb2xfaWQpICU+JQogIGd0KCkgJT4lCiAgdGFiX2hlYWRlcih0aXRsZT0iQ29sbGVjdG9ycyB3aXRob3V0IGEgbmFtZSIpICU+JQogIGZtdF9pbnRlZ2VyKG4pCmBgYAoKIyBHZW9ncmFwaGljYWwgb3ZlcnZpZXcKCmBgYHtyfQpkIDwtIHBfbG9jICU+JSAKICBjb3VudChsb2NfaWQpICU+JSAKICBpbm5lcl9qb2luKGxvY2F0aW9ucykgJT4lCiAgc2VsZWN0KG5hbWUsbikgJT4lCiAgY29sbGVjdCgpCgpwb2Vtc193aXRob3V0X2xvY2F0aW9uIDwtIHBvZW1zICU+JSAKICBhbnRpX2pvaW4ocF9sb2MpICU+JSAKICBjb3VudCgpICU+JSAKICBwdWxsKCkKCnVucHJvamVjdGVkX2xvY2F0aW9ucyA8LSBkICU+JQogIGFudGlfam9pbihwb2x5Z29ucykgJT4lCiAgYWRkX3JvdyhuYW1lPU5BLG49cG9lbXNfd2l0aG91dF9sb2NhdGlvbikKYGBgCgoKYGBge3IsIGZpZy5oZWlnaHQ9MTF9CnBvbHlnb25zICU+JQogIGxlZnRfam9pbihkKSAlPiUKICB0bV9zaGFwZSgpICsKICB0bV9wb2x5Z29ucyhjb2w9J24nLCBpZD0nbmFtZScsIHN0eWxlPSdmaXNoZXInLCBwYWxldHRlPSdwbGFzbWEnKSArCiAgdG1fbGF5b3V0KHRpdGxlPXN0cl9jKCJHZW9ncmFwaGljYWwgb3ZlcnZpZXcuIE1pc3NpbmcgIix1bnByb2plY3RlZF9sb2NhdGlvbnMgJT4lIHRhbGx5KHd0PW4pICU+JSBwdWxsKCkgJT4lIHAsIiBwb2Vtcy4iKSkKYGBgCgojIyBQb2VtIGxvY2F0aW9ucyBub3QgbWFwcGVkCgpgYGB7cn0KdW5wcm9qZWN0ZWRfbG9jYXRpb25zICU+JQogIGFycmFuZ2UoZGVzYyhuKSkgJT4lCiAgZ3QoKSAlPiUKICB0YWJfaGVhZGVyKCJQb2VtIGxvY2F0aW9ucyBub3QgbWFwcGVkIikgJT4lCiAgZm10X2ludGVnZXIobikKYGBgCgojIyBHZW9ncmFwaGljYWwgb3ZlcnZpZXcgYnkgY29sbGVjdGlvbgoKYGBge3J9CmQgPC0gcF9sb2MgJT4lIAogIGxlZnRfam9pbihwb2VtcykgJT4lCiAgY291bnQoY29sbGVjdGlvbixsb2NfaWQpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgaW5uZXJfam9pbihsb2NhdGlvbnMpICU+JQogIHNlbGVjdChjb2xsZWN0aW9uLG5hbWUsbikgJT4lCiAgY29sbGVjdCgpCgpwb2Vtc193aXRob3V0X2xvY2F0aW9uIDwtIHBvZW1zICU+JSAKICBhbnRpX2pvaW4ocF9sb2MpICU+JSAKICBjb3VudChjb2xsZWN0aW9uKSAlPiUgCiAgY29sbGVjdCgpICU+JQogIG11dGF0ZShuYW1lPU5BX2NoYXJhY3Rlcl8pCgp1bnByb2plY3RlZF9sb2NhdGlvbnMgPC0gZCAlPiUKICBhbnRpX2pvaW4ocG9seWdvbnMpICU+JQogIHVuaW9uX2FsbChwb2Vtc193aXRob3V0X2xvY2F0aW9uKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0PTExfQpwb2VtcyAlPiUgCiAgZGlzdGluY3QoY29sbGVjdGlvbikgJT4lCiAgcHVsbCgpICU+JQogIG1hcCh+CiAgICB0bV9zaGFwZSgKICAgICAgcG9seWdvbnMgJT4lCiAgICAgICAgbGVmdF9qb2luKAogICAgICAgICAgcF9sb2MgJT4lIAogICAgICAgICAgICBpbm5lcl9qb2luKHBvZW1zICU+JSBmaWx0ZXIoY29sbGVjdGlvbj09LngpLGJ5PWMoInBfaWQiKSkgJT4lCiAgICAgICAgICAgIGNvdW50KGxvY19pZCkgJT4lIAogICAgICAgICAgICBpbm5lcl9qb2luKGxvY2F0aW9ucykgJT4lCiAgICAgICAgICAgIHNlbGVjdChuYW1lLG4pICU+JQogICAgICAgICAgICBjb2xsZWN0KCkKICAgICAgICApCiAgICApICsKICAgIHRtX3BvbHlnb25zKGNvbD0nbicsIGlkPSduYW1lJywgc3R5bGU9J2Zpc2hlcicsIHBhbGV0dGU9J3BsYXNtYScpICsKICAgIHRtX2xheW91dCh0aXRsZT1zdHJfYygiR2VvZ3JhcGh5IG9mICIsLngsIi4gTWlzc2luZyAiLHVucHJvamVjdGVkX2xvY2F0aW9ucyAlPiUgZmlsdGVyKGNvbGxlY3Rpb249PS54KSAlPiUgdGFsbHkod3Q9bikgJT4lIHB1bGwoKSAlPiUgcCwiIHBvZW1zLiIpKQogICkKYGBgCgojIyBQb2VtIGxvY2F0aW9ucyBub3QgbWFwcGVkIGJ5IGNvbGxlY3Rpb24KCmBgYHtyLCByZXN1bHRzPSJhc2lzIn0KcG9lbXMgJT4lIAogIGRpc3RpbmN0KGNvbGxlY3Rpb24pICU+JQogIHB1bGwoKSAlPiUKICBtYXAofgogICAgdW5wcm9qZWN0ZWRfbG9jYXRpb25zICU+JQogICAgICBmaWx0ZXIoY29sbGVjdGlvbj09LngpICU+JQogICAgICBhcnJhbmdlKGRlc2MobikpICU+JQogICAgICBzZWxlY3QoLWNvbGxlY3Rpb24pICU+JQogICAgICBndCgpICU+JQogICAgICB0YWJfaGVhZGVyKHN0cl9jKCJQb2VtIGxvY2F0aW9ucyBub3QgbWFwcGVkIGluICIsLngpKSAlPiUKICAgICAgZm10X2ludGVnZXIobikKICApCmBgYAoKIyBTcGF0aW90ZW1wb3JhbCBvdmVydmlldwoKYGBge3J9CmQgPC0gcG9lbXMgJT4lCiAgbGVmdF9qb2luKHBfeWVhciAlPiUgbXV0YXRlKHllYXI9aWZfZWxzZSh5ZWFyICVpbiUgYygwTCw5OTk5TCksTkEseWVhcikpKSAlPiUgCiAgY29sbGVjdCgpICU+JQogIG11dGF0ZSh5ZWFyX250aWxlPW50aWxlKHllYXIsMTEpKSAlPiUKICBncm91cF9ieSh5ZWFyX250aWxlKSAlPiUKICBtdXRhdGUoeWVhcnM9c3RyX2MobWluKHllYXIpLCItIixtYXgoeWVhcikpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbGVmdF9qb2luKHBfbG9jICU+JSBjb2xsZWN0KCkpICU+JSAKICBjb3VudCh5ZWFycyxsb2NfaWQpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgbGVmdF9qb2luKGxvY2F0aW9ucyAlPiUgc2VsZWN0KGxvY19pZCxuYW1lKSAlPiUgY29sbGVjdCgpKQpgYGAKCgpgYGB7cixmaWcuaGVpZ2h0PTExfQpwb2x5Z29ucyAlPiUgCiAgbGVmdF9qb2luKGQgJT4lIGNvbXBsZXRlKG5hbWUseWVhcnMpKSAlPiUKICB0bV9zaGFwZSgpICsKICB0bV9wb2x5Z29ucyhjb2w9J24nLCBpZD0nbmFtZScsIHN0eWxlPSdmaXNoZXInLCBwYWxldHRlPSdwbGFzbWEnKSArCiAgdG1fbGF5b3V0KG1haW4udGl0bGU9Ikdlb2dyYXBoaWNhbCBvdmVydmlld3MgYnkgdGltZSIsbGVnZW5kLm91dHNpZGUuc2l6ZT0wLjEpICsKICB0bV9mYWNldHMoYnk9InllYXJzIixuY29sPTQpCmBgYAoKIyBQb2VtIHZlcnNlIHN0YXRpc3RpY3MKCiMjIExpbmUgdHlwZXMKCmBgYHtyfQpkIDwtIHZlcnNlcyAlPiUgCiAgbGVmdF9qb2luKHZlcnNlX3BvZW0pICU+JSAKICBsZWZ0X2pvaW4ocG9lbXMpICU+JSAKICBjb3VudChjb2xsZWN0aW9uLHR5cGUpICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgYXJyYW5nZShjb2xsZWN0aW9uLGRlc2MobikpICU+JQogIGNvbGxlY3QoKQpgYGAKCgpgYGB7cn0KZCAlPiUgCiAgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgbXV0YXRlKHByb3BvcnRpb249bi9zdW0obikpICU+JQogIGd0KCkgJT4lCiAgZm10X2ludGVnZXIobikgJT4lCiAgZm10X3BlcmNlbnQocHJvcG9ydGlvbikKYGBgCgojIyBWZXJzZSBsaW5lIGxlbmd0aHMKCmBgYHtyfQpkX25yX2NoYXJhY3RlcnMgPC0gdmVyc2VzX2NsICU+JQogIG11dGF0ZShucl9jaGFyYWN0ZXJzPXN0cl9sZW5ndGgodGV4dCkpICU+JQogIGxlZnRfam9pbih2ZXJzZV9wb2VtKSAlPiUgCiAgbGVmdF9qb2luKHBvZW1zKSAlPiUgCiAgY291bnQoY29sbGVjdGlvbixucl9jaGFyYWN0ZXJzKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIGFycmFuZ2UoY29sbGVjdGlvbixkZXNjKG4pKSAlPiUKICBjb2xsZWN0KCkKCmRfbnJfd29yZHMgPC0gd29yZF9vY2MgJT4lCiAgZ3JvdXBfYnkodl9pZCkgJT4lCiAgc3VtbWFyaXNlKG5yX3dvcmRzPW1heChwb3MpLC5ncm91cHM9ImRyb3AiKSAlPiUKICBsZWZ0X2pvaW4odmVyc2VfcG9lbSkgJT4lCiAgbGVmdF9qb2luKHBvZW1zKSAlPiUgCiAgY291bnQoY29sbGVjdGlvbixucl93b3JkcykgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBhcnJhbmdlKGNvbGxlY3Rpb24sZGVzYyhuKSkgJT4lCiAgY29sbGVjdCgpCmBgYAojIyMgVmVyc2UgbGluZSBsZW5ndGhzIGluIGNoYXJhY3RlcnMKYGBge3J9CmRfbnJfY2hhcmFjdGVycyAlPiUgCiAgZmlsdGVyKG5yX2NoYXJhY3RlcnM8PTYwKSAlPiUKICBnZ3Bsb3QoYWVzKHg9bnJfY2hhcmFjdGVycyx5PW4pKSArCiAgZ2VvbV9jb2wod2lkdGg9MSkgKwogIGZhY2V0X3dyYXAofmNvbGxlY3Rpb24sc2NhbGVzPSJmcmVlX3kiKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hX2Zvcm1hdCgpKSArCiAgeGxhYigiTnVtYmVyIG9mIGNoYXJhY3RlcnMiKSArCiAgeWxhYigiVmVyc2VzIikgKwogIGxhYnModGl0bGU9Ik51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHZlcnNlIGxpbmVzIikKYGBgCgpgYGB7cn0KZF9ucl9jaGFyYWN0ZXJzICU+JSAKICBncm91cF9ieShjb2xsZWN0aW9uKSAlPiUKICBtdXRhdGUocHJvcD1uL3N1bShuKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcihucl9jaGFyYWN0ZXJzPD02MCkgJT4lCiAgZ2dwbG90KGFlcyh4PW5yX2NoYXJhY3RlcnMseT1jb2xsZWN0aW9uLGZpbGw9Y29sbGVjdGlvbixoZWlnaHQ9cHJvcCkpICsKICBnZW9tX2RlbnNpdHlfcmlkZ2VzKHN0YXQ9J2lkZW50aXR5JykgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoYmFzZV9mYW1pbHk9IkFyaWFsIikgKwojICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzPXNjYWxlczo6cGVyY2VudF9mb3JtYXQoKSkgKwogIHhsYWIoIk51bWJlciBvZiBjaGFyYWN0ZXJzIikgKwogIHlsYWIoIlZlcnNlcyIpICsKICBsYWJzKHRpdGxlPSJOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiB2ZXJzZSBsaW5lcyIpCmBgYAoKCiMjIyBWZXJzZSBsaW5lcyB3aXRoIG1vcmUgdGhhbiA2MCBjaGFyYWN0ZXJzCgpgYGB7cn0KZF9ucl9jaGFyYWN0ZXJzICU+JSAKICBtdXRhdGUobmw9aWZfZWxzZShucl9jaGFyYWN0ZXJzPjYwLG4sMEwpKSAlPiUKICBncm91cF9ieShjb2xsZWN0aW9uKSAlPiUKICBzdW1tYXJpc2UobGluZXM9c3VtKG5sKSxwcm9wb3J0aW9uPXN1bShubCkvc3VtKG4pLC5ncm91cHM9ImRyb3AiKSAlPiUKICBhcnJhbmdlKGRlc2MobGluZXMpKSAlPiUKICBndCgpICU+JQogIHRhYl9oZWFkZXIodGl0bGU9IlZlcnNlIGxpbmVzIHdpdGggbW9yZSB0aGFuIDYwIGNoYXJhY3RlcnMiKSAlPiUKICBmbXRfaW50ZWdlcihsaW5lcykgJT4lCiAgZm10X3BlcmNlbnQocHJvcG9ydGlvbikKYGBgCgoKIyMjIFZlcnNlIGxpbmUgbGVuZ3RocyBpbiB3b3JkcwpgYGB7cn0KZF9ucl93b3JkcyAlPiUgCiAgZmlsdGVyKG5yX3dvcmRzPD0xMCkgJT4lCiAgZ2dwbG90KGFlcyh4PW5yX3dvcmRzLHk9bikpICsKICBnZW9tX2NvbCh3aWR0aD0xKSArCiAgZmFjZXRfd3JhcCh+Y29sbGVjdGlvbixzY2FsZXM9ImZyZWVfeSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDEwLGJ5PTIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1zY2FsZXM6OmNvbW1hX2Zvcm1hdCgpKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgeGxhYigiTnVtYmVyIG9mIHdvcmRzIikgKwogIHlsYWIoIlZlcnNlcyIpICsKICBsYWJzKHRpdGxlPSJOdW1iZXIgb2Ygd29yZHMgaW4gdmVyc2UgbGluZXMiKQpgYGAKCmBgYHtyfQpkX25yX3dvcmRzICU+JSAKICBmaWx0ZXIobnJfd29yZHM8PTEwKSAlPiUKICB1bmNvdW50KG4pICU+JQogIGdncGxvdChhZXMoeD1ucl93b3Jkcyx5PWNvbGxlY3Rpb24sZmlsbD1jb2xsZWN0aW9uKSkgKwogIHN0YXRfYmlubGluZShiaW53aWR0aD0xKSArCiAgdGhlbWVfaHNjaV9kaXNjcmV0ZShiYXNlX2ZhbWlseT0iQXJpYWwiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxMCxieT0yKSkgKwogIHhsYWIoIk51bWJlciBvZiB3b3JkcyIpICsKICB5bGFiKCJWZXJzZXMiKSArCiMgIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50X2Zvcm1hdCgpKSArCiAgbGFicyh0aXRsZT0iTnVtYmVyIG9mIHdvcmRzIGluIHZlcnNlIGxpbmVzIikKYGBgCgojIyMgVmVyc2UgbGluZXMgd2l0aCBtb3JlIHRoYW4gMTAgd29yZHMKCmBgYHtyfQpkX25yX3dvcmRzICU+JSAKICBtdXRhdGUobmw9aWZfZWxzZShucl93b3Jkcz4xMCxuLDBMKSkgJT4lCiAgZ3JvdXBfYnkoY29sbGVjdGlvbikgJT4lCiAgc3VtbWFyaXNlKGxpbmVzPXN1bShubCkscHJvcG9ydGlvbj1zdW0obmwpL3N1bShuKSwuZ3JvdXBzPSJkcm9wIikgJT4lCiAgYXJyYW5nZShkZXNjKGxpbmVzKSkgJT4lCiAgZ3QoKSAlPiUKICB0YWJfaGVhZGVyKHRpdGxlPSJWZXJzZSBsaW5lcyB3aXRoIG1vcmUgdGhhbiAxMCB3b3JkcyIpICU+JQogIGZtdF9pbnRlZ2VyKGxpbmVzKSAlPiUKICBmbXRfcGVyY2VudChwcm9wb3J0aW9uKQpgYGAKCmBgYHtyfQp2ZXJzZV9ucl93b3JkcyA8LSB3b3JkX29jYyAlPiUgCiAgZ3JvdXBfYnkodl9pZCkgJT4lCiAgc3VtbWFyaXNlKG5yX3dvcmRzPW1heChwb3MpKSAlPiUKICBjb21wdXRlX2EodW5pcXVlX2luZGV4ZXM9bGlzdChjKCJ2X2lkIiwibnJfd29yZHMiKSkpCgp3b3JkX25yX2NoYXJhY3RlcnMgPC0gd29yZHMgJT4lCiAgbXV0YXRlKG5yX2NoYXJhY3RlcnM9c3RyX2xlbmd0aCh0ZXh0KSkgJT4lCiAgc2VsZWN0KHdfaWQsbnJfY2hhcmFjdGVycykgJT4lCiAgY29tcHV0ZV9hKHVuaXF1ZV9pbmRleGVzPWxpc3QoYygid19pZCIsIm5yX2NoYXJhY3RlcnMiKSkpCgpkIDwtIHdvcmRfb2NjICU+JQogIGxlZnRfam9pbih3b3JkX25yX2NoYXJhY3RlcnMpICU+JQogIGxlZnRfam9pbih2ZXJzZV9ucl93b3JkcykgJT4lCiAgbGVmdF9qb2luKHZlcnNlX3BvZW0gJT4lIHNlbGVjdCgtcG9zKSxieT1jKCJ2X2lkIikpICU+JSAKICBsZWZ0X2pvaW4ocG9lbXMpICU+JSAKICBjb3VudChjb2xsZWN0aW9uLG5yX3dvcmRzLHBvcyxucl9jaGFyYWN0ZXJzKSAlPiUKICBjb2xsZWN0KCkKYGBgCgpgYGB7cn0KZCAlPiUKICBncm91cF9ieShjb2xsZWN0aW9uLG5yX3dvcmRzLHBvcykgJT4lCiAgbXV0YXRlKHByb3A9bi9zdW0obikpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBmaWx0ZXIobnJfd29yZHM+PTIsbnJfd29yZHM8NikgJT4lCiAgbXV0YXRlKG5yX3dvcmRzPWFzX2ZhY3Rvcihucl93b3JkcykscG9zPWFzX2ZhY3Rvcihwb3MpKSAlPiUKICB1bmNvdW50KG4pICU+JQogIGdncGxvdChhZXMoeD1ucl9jaGFyYWN0ZXJzLHk9bnJfd29yZHMsZmlsbD1ucl93b3JkcykpICsKICBzdGF0X2JpbmxpbmUoYmlud2lkdGg9MSkgKwogIGZhY2V0X2dyaWQoY29sbGVjdGlvbn5wb3MsbGFiZWxsZXIgPSBsYWJlbGxlcihwb3M9bGFiZWxfYm90aCkpICsgCiAgeGxhYigiTnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gd29yZCIpICsKICB5bGFiKCJOdW1iZXIgb2Ygd29yZHMgaW4gdmVyc2UiKSArCiAgbGFicygKICAgIHRpdGxlPSJOdW1iZXIgb2YgY2hhcmFjdGVycyBpbiB3b3JkcyBieSB0aGVpciBwb3NpdGlvbiIsCiAgICBzdWJ0aXRsZT0iQWNjb3JkaW5nIHRvIGxlbmd0aCBvZiB2ZXJzZSBhbmQgY29sbGVjdGlvbiIKICAgICkgKwogIHRoZW1lX2hzY2lfZGlzY3JldGUoYmFzZV9mYW1pbHk9IkFyaWFsIikKYGBgCgo=